#include "string.h"

#define _MAIN // 使用自写函数
// #define _IMPROVE	//使用改进的函数

String::operate = (const char *s)
{
	len = strlen(s);			   // 获取大小
	delete[] str;				   // 释放原来的内存
	this->str = new char[len + 1]; // 创建新空间
	strcpy(this->str, s);		   // 复制内容
}
#ifdef _MAIN
String::operate = (const String &sad) // ！不需要引用，会改变sad
{
	len = strlen(sad.len);		   // 获取大小
	delete[] str;				   // 释放原来的内存
	this->str = new char[len + 1]; // 创建新空间
	strcpy(this->str, sad.str);	   // 复制内容
}
#endif

#ifdef _IMPROVE
String &String::operate = (const String sad) // 返回对象
{
	len = strlen(sad.len);		   // 获取大小
	delete[] str;				   // 释放原来的内存
	this->str = new char[len + 1]; // 创建新空间
	strcpy(this->str, sad.str);	   // 复制内容
	return *this;
}
#endif

String::operate += (const char *s) //+=，源串接上新串，拼接功能
{
	this->len += strlen(s); // 获取大小
	char *temp = this->str; // 接收源串的空间

	this->str = new char[this->len + 1]; // 创建新空间

	strcpy(this->str, temp); // 复制源串内容
	strcat(this->str, s);	 // 拼接新串内容

	delete[] temp; // 释放源串的空间
				   // return this;	//返回新串
}
/*+=，
步骤1，保存源串，
步骤2：delete清空this->str的空间，、
步骤3：new空间大小为源串加参数串
步骤3：复制源串内容到新空间，再拼接参数串内容，
步骤4：释放源空间或叫临时空间
*/
#ifdef _MAIN							  // 只创建容器的，不创建完整的对象
void String::operate += (const String &s) //+=，源串接上新串，拼接功能
{
	this->len += s.len;		// 获取大小
	char *temp = this->str; // 接收源串的空间

	this->str = new char[this->len + 1]; // 创建新空间

	strcpy(this->str, temp);  // 复制源串内容
	strcat(this->str, s.str); // 拼接新串内容

	delete[] temp; // 释放源串的空间
				   // return this;	//返回新串
}
#endif

#ifdef _IMPROVE // 创建完整对象
void operator+=(String &str)
{
	String temp;
	temp.buf = new char[this->len + 1]; // new 在分配空间时会自动赋0
	strcpy(temp.buf, this->buf);

	this->len += str.len;
	delete[] this->buf;

	this->buf = new char[this->len + 1];
	strcpy(this->buf, temp.buf);
	strcat(this->buf, str.buf);
}
#endif

/*
	拼接两串，产生新的临时串，不改变原串，临时串该以什么形式返回
*/
String &String::operate + (const char *s) // 返回新串，以String形式
{
	int len = this->len + strlen(s);
	char *temp = new char[len + 1]; // 创建临时指针，用于创建临时的作为返回值的String对象创建参数
	strcpy(temp, this->str);		// 复制原串内容到临时指针
	strcat(temp, s);				// 拼接新串内容到临时指针

	String ret(temp); // 创建返回值对象，参数为临时指针
	delete[] temp;	  // 释放临时指针

	return ret; // 返回新串
}
/*
	拼接两串，产生新的临时串，不改变原串，临时串该以什么形式返回
*/
String &String::operate + (String s) // 返回新串，以String形式
{
	int len = this->len + s.len;
	char *temp = new char[len + 1]; // 创建临时指针，用于创建临时的作为返回值的String对象创建参数
	strcpy(temp, this->str);		// 复制原串内容到临时指针
	strcat(temp, s.str);			// 拼接新串内容到临时指针

	String ret(temp); // 创建返回值对象，参数为临时指针
	delete[] temp;	  // 释放临时指针

	return ret; // 返回新串
}

// 重载各种比较运算符
bool String::operator==(const char *src)
{
	return strcmp(this->buf, src) == 0 ? true : false;
}
bool String::operator==(String &str)
{
	return strcmp(this->buf, str.buf) == 0 ? true : false;
}

bool String::operator>(String &str)
{
	return strcmp(this->buf, str.buf) > 0 ? true : false;
}
bool String::operator<(String &str)
{
	return strcmp(this->buf, str.buf) < 0 ? true : false;
}
bool String::operator!=(String &str)
{
	return strcmp(this->buf, str.buf) != 0 ? true : false;
}

void String::show()
{
	if (buf != nullptr)
		cout << buf << endl;
	else
		cout << "null" << endl;
}

int String::find(char c)	//查找指定字符的位置，返回索引
{
	for (int i = 0; i < len; i++)
	{
		if (buf[i] == c)
			return i;
	}
}

